# 使用scrapy-redis分布式爬取CSDN学院平台中所有课程信息。如：https://edu.csdn.net/courses/k 爬取所有课程详情url地址。然后再通过队列url中对应的每个课程详情信息，使用分布式爬取。如：https://edu.csdn.net/course/detail/5466。
# 要求内容：课程标题，课时、讲师、适合人群、学习人数、价格、课程大纲。
# 第十周作业2)
# 班级：Python五期
# 学员：李子坚

# -*- coding: utf-8 -*-
import scrapy
from courseinfo.items import CourseItem
from scrapy_redis.spiders import RedisSpider

class CourseSpider(RedisSpider):
    '''爬取CSDN学院平台课程信息页面URL的爬虫类'''
    name = 'course'
    #allowed_domains = ['edu.csdn.net']
    #start_urls = ['http://edu.csdn.net/']
    redis_key = "CourseSpider:start_urls"		#存储爬取课程URL的REDIS KEY

    def __init__(self, *args, **kwargs):
        '''初始化爬虫类属性'''
        #动态定义允许的域列表
        domain = kwargs.pop('domain', '')
        self.allowed_domains = filter(None, domain.split(','))
        super(CourseSpider, self).__init__(*args, **kwargs)
        
    def parse(self, response):
        '''解析每个CSDN课程列表页面，提取课程详情页URL'''
        course_list = response.css("div.course_dl_list")
        for course in course_list:
            #提取课程列表的课程详情页URL
            course_url = course.css("a::attr(href)").extract_first()
            #构造每一页课程详情页的爬取
            yield scrapy.Request(url=course_url, callback=self.parse_item, dont_filter=True)

    def parse_item(self, response):
        '''解析课程详情页中课程信息'''
        item = CourseItem()

        item['title'] = response.css("h1::text").extract_first().strip()
        item['period'] = response.css("span.pinfo")[0].re_first('<span class="pinfo">[0-9]+/([0-9]+?)</span>')
        item['professor'] = response.css("div.professor_name a::text").extract_first().strip()
        item['forwho'] = response.css("div.forwho span.for::text").extract_first().strip()
        item['joined_num'] = response.css("span.howmany span.num::text").extract_first().strip()
        item['price'] = response.css("span.money::text").extract_first().strip()
        
        item['section_list'] = ""
        section_list = response.css("ul.section_list li.isable")	#获取课程章节列表
        for section in section_list:
            item['section_list'] += section.css("span.ellipsis::text").extract_first().strip() + "\r\n"

        yield item
        

